﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace Marmat.Forms.Skin
{
    /// <summary>
    /// 表示 Windows 文本框控件。
    /// </summary>
    [ToolboxItem(false)]
    internal class TextBox : System.Windows.Forms.TextBox
    {

        /// <summary>
        /// 获取创建控件句柄时所需要的创建参数。
        /// </summary>
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams prams = base.CreateParams;
                if (Win32API.Kernel32.LoadLibrary("msftedit.dll") != IntPtr.Zero)
                {
                    prams.ExStyle |= 0x020; // transparent   
                    //prams.ExStyle |= 0x02000000; //防止WinFrom切换闪屏问题时也可采用此种办法。
                    prams.ClassName = "RICHEDIT50W";
                }
                return prams;
            }
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case Win32API.Messages.WM_NCCALCSIZE:
                    // 处理非客户区
                    if (this.BorderStyle == BorderStyle.None)
                    {
                        var rect = (SkinScrollControl.RECT)Marshal.PtrToStructure(m.LParam, typeof(SkinScrollControl.RECT));
                        rect.Left += 1;
                        rect.Top += 1;
                        rect.Right -= 1;
                        rect.Bottom -= 1;
                        Marshal.StructureToPtr(rect, m.LParam, true); // 将修改完毕的区域拷贝给 lParam
                        m.Result = new IntPtr(1);
                    }
                    else
                        base.WndProc(ref m);
                    break;
                //case 0x133:
                //case 0xf:
                //    base.WndProc(ref m);
                //    //拦截系统消息，获得当前控件进程以便重绘。
                //    //一些控件（如TextBox、Button等）是由系统进程绘制，重载OnPaint方法将不起作用.
                //    //所有这里并没有使用重载OnPaint方法绘制TextBox边框。
                //    //
                //    //MSDN:重写 OnPaint 将禁止修改所有控件的外观。
                //    //那些由 Windows 完成其所有绘图的控件（例如 Textbox）从不调用它们的 OnPaint 方法，
                //    //因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档，
                //    //查看 OnPaint 方法是否可用。如果某个控件未将 OnPaint 作为成员方法列出，
                //    //则您无法通过重写此方法改变其外观。
                //    //
                //    //MSDN:要了解可用的 Message.Msg、Message.LParam 和 Message.WParam 值，
                //    //请参考位于 MSDN Library 中的 Platform SDK 文档参考。可在 Platform SDK（“Core SDK”一节）
                //    //下载中包含的 windows.h 头文件中找到实际常数值，该文件也可在 MSDN 上找到。
                //    IntPtr hDC = Win32API.User32.GetWindowDC(m.HWnd);
                //    if (hDC.ToInt32() == 0)
                //    {
                //        return;
                //    }
                //    //System.Drawing.Pen pen = new Pen(this._BorderColor, 1);
                //    //pen.Color = _BorderColor;
                //    ////绘制边框
                //    //System.Drawing.Graphics g = Graphics.FromHdc(hDC);
                //    //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                //    //g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1);
                //    //pen.Dispose();
                //    //返回结果
                //    m.Result = IntPtr.Zero;
                //    //释放
                //    Win32API.User32.ReleaseDC(m.HWnd.ToInt32(), hDC.ToInt32());
                //    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
            //string str = "";
            //int i = 0;
            //if (m.Msg == 0x0204)
            //    i++;
            //if (!AllowReturn
            //    && m.Msg == WM_PASTE
            //    && System.Windows.Forms.Clipboard.ContainsText())
            //{
            //    str = System.Windows.Forms.Clipboard.GetText();
            //    System.Windows.Forms.Clipboard.Clear();
            //    string nstr = str.Replace(char.ConvertFromUtf32((int)Keys.Return), "").Replace(char.ConvertFromUtf32((int)Keys.LineFeed), "");
            //    System.Windows.Forms.Clipboard.SetText(nstr);
            //}
        }
    }
}
